package com.bravo.other.rate_limiter.fix;

/**
 * 固定窗口算法 
 * 定义一个时间窗口（如1分钟），在该窗口内允许的最大请求数是固定的。
 * 窗口内请求数超过限制时，拒绝请求。
 * 
 * 
 * 
 */
public class FixWindow {
    
    // 窗口数
    private static final int WINDOW_SIZE = 1000;
    
    // 窗口内允许的最大请求数
    private static final int MAX_REQUEST = 5;
    
    // 窗口开始时间
    private static long startTime = System.currentTimeMillis();
    
    // 窗口内请求数
    private static int count = 0;

    // 是否允许请求
    public static boolean isAllow() {
        long now = System.currentTimeMillis();
        long interval = now - startTime;
        if (interval >= 1000) {
            // 重置窗口
            resetCounter(interval);
            increment();
            return true;
        }
        if (count<MAX_REQUEST) {
            increment();
            return true;
        }
        return false;
    }

    // 计数器+1
    public static synchronized void increment() {
        count++;
    }

    public static void resetCounter(long interval) {
        startTime = interval/WINDOW_SIZE * WINDOW_SIZE+startTime;
        count = 0;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            if (i%7==0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (isAllow()) {
                System.out.println("允许请求");
            } else {
                System.out.println("拒绝请求");
            }
        }
    }
    
}
